function myNew(){
    // 创建一个obj
    let obj={};
    // 获得构造函数
    // console.log(arguments);// [Arguments] { '0': [Function: Cat] }
    let con=[].shift.call(arguments);
    // console.log(con); // [Function: Cat]
    // 绑定原型
    obj.__proto__=con.prototype;
    // 绑定this，获得构造函数
    let res=con.apply(obj,arguments);
    // 返回新对象
    return typeof res==="object"?res:obj;
}

function Cat(){
    this.name='cat';
    this.age=10;
}

const kit=myNew(Cat);
console.log(kit instanceof Cat);
console.log(kit.name);

// new的实例化过程
// 1. 在内存中创建一个新的空对象
// 2. 让this指向这个对象
// 3. 执行构造函数里面的代码，给这个新对象添加属性和方法
// 返回这个新对象(所有构造函数里面的东西不需要返回)

// [].slice.call(arguments) 将类数组转化为数组
// 通过call改变slice里面的this指向arguments，并对arguments进行复制，返回一个新数组
// [].shift.call(arguments)
// 删除并拿到arguments的第一项

Object.create()

Object.create()=function (obj){
    function F(){}
    F.prototype=obj;
    return new F();
}